/**
 * JS 数据类型
 * number、string、boolean、object、null、undefined、bigint、symbol
 */

console.log("定义变量");
let a = 123;
a = "hello";
console.log(a);
console.log();

console.log("定义常量");
const b = 123;
// b = "hello";
console.log(b);
console.log();

console.log("数据类型");
console.log(typeof b); // number (NaN: Not a Number，具有粘性，NaN参与任何运算的结果都是NaN)
console.log(typeof a); // string
console.log(typeof true); // boolean (ture 和 false)
console.log(typeof c); // undefined (undefined)
console.log(typeof null); // null (null)
console.log(typeof Math); // object

console.log("显式类型转换");
// -> string
console.log(String(null));
console.log((10.01).toString());
// -> number
console.log(Number("   ")); // 0
console.log(Number(" 12  ")); // 12
console.log(Number(`10.01px`)); // NaN
console.log(Number(undefined)); // NaN
console.log(Number(null)); // 0
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(parseFloat("10.015px").toFixed(2)); // 10.02
console.log(parseInt("10.01px")); // 10
// -> boolean
console.log(Boolean(100)); // true
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean("   ")); // true
console.log(Boolean("")); // false
console.log();

console.log("类型隐式转换");
// -> string, + 一侧是string时，它就变成了字符串连接符
console.log("px" + 5 + 4); // "px54",  5 -> "5", 4 -> "4"
console.log(5 + 4 + "px"); // "9px"
// -> number, 算术运算符：+-*/%^，比较运算符：>, <, ==, >=, <=，严格等 ===
console.log("4" - 2); // 2, "4" -> 4
console.log("4px" - 2); // NaN, "4px" -> NaN, NaN-2=NaN
console.log(null - 2); // -2, null -> 0
console.log("" == false); // true, "" -> 0, false -> 0, 0 == 0
console.log("" === false); // false, 相等的首要条件是两端数据类型一致
// -> boolean, 逻辑运算符：&&、||、！
console.log(0 || null || "abc"); // "abc", 或运算，寻找第一个真值, 0 -> false，null -> false
console.log(0 || "abc" || null); // "abc", "abc" -> true
console.log(123 && null && "abc"); // null, 与运算，寻找第一个假值，123 -> true， null -> false
console.log(123 && 321 && "abc"); // "abc", 找不到假值，就取最后一个值
